Purpose

Using the bulk summarized GWPS data object, compute the WUI for each mulit-UTR gene in each perturbation. Additionally, compute average WUI for each perturbation and analyze for outliers.

Note that WUI can only be computed for detected genes. Targets with low cell recovery tend to recover fewer genes and will rely on higher expression genes. If these have a different WUI profile than lower expression genes, there could be a bias in the average WUI computed for the target. Currently, we do not attempt to model this.

Initialization

Libraries

library(magrittr)
library(tidyverse)
library(cowplot)
library(plotly)
library(ggbeeswarm)
library(SummarizedExperiment)
library(Matrix)
library(sparseMatrixStats)
library(clusterProfiler)
library(org.Hs.eg.db)

Parameters

set.seed(20210818)
MIN_UMIS=1000
MIN_MEAN_UI=0.10
FILE_SE="data/se/kd6_essential_bulk_expressed.Rds"

FILE_OUT="tbl/kd6_essential_wui_filtered-noipa-ui10.xlsx"
DIR_IMG_OUT="img/kd6-essential-filtered-noipa-ui10-"

## KNOWN FACTORS
GENES_CPSF <- c("CPSF1", "CPSF2", "CPSF3", "CPSF4", "WDR33", "FIP1L1")
GENES_CF1 <- c("NUDT21", "CPSF6", "CPSF7")
GENES_CF2 <- c("PCF11", "CLP1")
GENES_CSTF <- c("CSTF1", "CSTF2", "CSTF2T", "CSTF3")
GENES_PAF <- c("PAF1", "CTR9", "RTF1")
GENES_NEF <- c("NXF1", "SRSF3", "SRSF7", "THOC5")

COLOR_MAP <- c("non-targeting"="grey",
               "CPSF complex"="#8FD979",
               "CFI complex"="purple",
               "CFII complex"="#FFAA66",
               "CSTF complex"="#F6CDA3",
               "PAF complex"="steelblue",
               "mRNA export factors"="magenta",
               "other"="black")

Helper Functions

compute_effective_count <- function (cts) {
  pct <- (cts %*% Diagonal(ncol(cts), 1/colSums(cts)))
  lpct <- pct
  lpct@x <- log2(lpct@x)
  2^(-colSums(pct*lpct))
}

Data

Loading

se_tx_target <- readRDS(FILE_SE)

Preprocessing

idx_ntp <- colnames(se_tx_target) %>%
    str_detect("non-targeting")

idx_multi_raw <- which(rowData(se_tx_target)$utr_type_no_ipa == 'multi' & !rowData(se_tx_target)$is_ipa)

cts_tx_ntp <- assay(se_tx_target[idx_multi_raw, idx_ntp], 'counts')

M_gene_tx <- rowData(se_tx_target[idx_multi_raw,]) %>% 
    as_tibble %>%
    dplyr::select(transcript_id, gene_id) %>%
    deframe %>%
    fac2sparse

cts_gene_ntp <- M_gene_tx %*% cts_tx_ntp

ui_tx_ntp <- as.matrix(cts_tx_ntp / (t(M_gene_tx) %*% cts_gene_ntp))

ncells_ntp <- se_tx_target$n_cells[idx_ntp]

mui_tx <- rowWeightedMeans(ui_tx_ntp, ncells_ntp, na.rm=TRUE)
mui_tx[is.na(mui_tx)] <- 0
    
idx_tx <- M_gene_tx[,mui_tx >= MIN_MEAN_UI] %>% { 
    idx_i <- rowSums(.) > 1;
    idx_j <- colSums(.[idx_i,]) > 0;
    .[idx_i, idx_j] 
} %>% colnames

df_multi <- rowData(se_tx_target[idx_tx,]) %>% as_tibble %>%
    mutate(ensembl_id=str_remove(gene_id, "\\.[0-9]+$")) %>%
    group_by(ensembl_id) %>%
    mutate(utr_rank_expr=rank(utr_rank),
           utr_wt=(utr_rank_expr - 1)/(max(utr_rank_expr) - 1)) %>%
    ungroup() %>%
    dplyr::select(transcript_id, transcript_name, gene_id, gene_name, ensembl_id, 
           utr_rank, utr_rank_expr, utr_wt) %>%
    arrange(gene_id, utr_rank)

## use ordered version
idx_tx <- df_multi$transcript_id

df_multi %>% distinct(ensembl_id) %>% nrow %>% 
    sprintf(fmt="Found %d multi-UTR genes.")
## [1] "Found 4780 multi-UTR genes."
df_multi %>% nrow %>% 
    sprintf(fmt="These consist of %d 3' UTR isoforms.")
## [1] "These consist of 11129 3' UTR isoforms."

Compute WUIs

wt_tx <- df_multi %>% dplyr::select(transcript_id, utr_wt) %>% deframe

M_gene_tx <- df_multi$ensembl_id %>% fac2sparse

cts_tx_target <- assay(se_tx_target[idx_tx,], "counts")

cts_gene_target <- M_gene_tx %*% cts_tx_target

ui_tx_target <- cts_tx_target / (t(M_gene_tx) %*% cts_gene_target)
#ui_tx_target[is.na(ui_tx_target)] <- 0

wui_gene_target <- M_gene_tx %*% Diagonal(length(wt_tx), wt_tx) %*% ui_tx_target

Compute Effective Transcripts

etx_target_multi <- cts_tx_target %>% compute_effective_count

Target Analysis

df_targets <- colData(se_tx_target) %>% as_tibble %>%
    mutate(mean_wui=colMeans(wui_gene_target[,sgID_AB], na.rm=TRUE),
           etx_multi=etx_target_multi[sgID_AB],
           n_genes_detected=colSums(!is.na(wui_gene_target[,sgID_AB]))) %>%
    mutate(gene_set=case_when(
        target_gene == "non-targeting" ~ "non-targeting",
        target_gene %in% GENES_CPSF ~ "CPSF complex",
        target_gene %in% GENES_CF1 ~ "CFI complex",
        target_gene %in% GENES_CF2 ~ "CFII complex",
        target_gene %in% GENES_CSTF ~ "CSTF complex",
        target_gene %in% GENES_PAF ~ "PAF complex",
        target_gene %in% GENES_NEF ~ "mRNA export factors",
        TRUE ~ "other"
    ) %>% factor(levels=c("other", "non-targeting", "CPSF complex", 
                          "CFI complex", "CFII complex", "CSTF complex",
                          "PAF complex", "mRNA export factors"))) %>%
    mutate(is_known=!gene_set %in% c("non-targeting", "other"))

Export

writexl::write_xlsx(df_targets, FILE_OUT)

Plots

WUI - All Targets

g <- df_targets %>%
    ggplot(aes(x="Perturbations", y=mean_wui)) +
    geom_violin(fill='lightgrey', size=0.2, draw_quantiles=c(0.25, 0.50, 0.75)) +
    geom_quasirandom(aes(color=gene_set, size=n_cells, text=target_gene), pch=16) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
    theme_bw() +
    labs(x=NULL, y="Mean WUI", color="Gene Set", size=NULL)
## Warning: Ignoring unknown aesthetics: text
ggplotly(g, tooltip=c("text", "y", "gene_set", "n_cells"))

WUI vs Effective Transcripts (Multi-UTR Genes)

g <- df_targets %>%
    ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
    geom_point(aes(size=n_cells), pch=16) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    theme(legend.position="none") +
    labs(x="Mean Weighted Usage Index",
         y="Effective Transcripts (Multi-UTR Genes)",
         color="Gene Set")

ggplotly(g, tooltip=c("text", "gene_set", "x", "y", "n_cells"))
df_targets %>%
    ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
    geom_point(data=filter(df_targets, gene_set == 'other'), size=0.5) +
    geom_point(data=filter(df_targets, gene_set == 'non-targeting'), size=0.5) +
    geom_point(data=filter(df_targets, is_known), size=3) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    labs(x="Mean Weighted Usage Index",
         y="Effective Transcripts (Multi-UTR Genes)",
         color="Gene Set")

ggsave(str_c(DIR_IMG_OUT, "wui_etx_multi.pdf"), width=8, height=6, dpi=300)

Gene Set Enrichment

awui_baseline <- df_targets %>%
    filter(target_gene == 'non-targeting') %$%
    weighted.mean(mean_wui, n_cells)

awui_targets <- df_targets %>% 
    filter(target_gene != 'non-targeting', n_cells >= 20) %>%
    group_by(target_gene_id) %>%
    summarize(mean_wui=weighted.mean(mean_wui, n_cells)) %>%
    mutate(mwui_dev=mean_wui-awui_baseline) %>%
    dplyr::select(target_gene_id, mwui_dev) %>% deframe %>% sort(decreasing=TRUE)

gseBP <- gseGO(awui_targets, ont="BP", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## Warning in fgseaMultilevel(...): For some pathways, in reality P-values are less
## than 1e-10. You can set the `eps` argument to zero for better estimation.
## leading edge analysis...
## done...
gseMF <- gseGO(awui_targets, ont="MF", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## leading edge analysis...
## done...
gseCC <- gseGO(awui_targets, ont="CC", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## leading edge analysis...
## done...

Biological Process

dotplot(gseBP, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseBP, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00247

emapplot(enrichplot::pairwise_termsim(gseBP), showCategory=Inf)

df_genesets <- gseBP@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseBP, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Cellular Component

dotplot(gseCC, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseCC, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00167

emapplot(enrichplot::pairwise_termsim(gseCC), showCategory=Inf)

df_genesets <- gseCC@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseCC, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Molecular Function

dotplot(gseMF, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseMF, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00143

emapplot(enrichplot::pairwise_termsim(gseMF), showCategory=Inf)

df_genesets <- gseMF@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseMF, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Conclusion

WUI appears to be sufficient to capture the major transcript-level action we had seen previously with contrasting simply proximal and distal transcripts.


Runtime Details

Session Info

## R version 4.1.1 (2021-08-10)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: macOS Big Sur 10.16
## 
## Matrix products: default
## BLAS/LAPACK: /Users/mfansler/miniconda3/envs/bioc_3_14/lib/libopenblasp-r0.3.18.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] org.Hs.eg.db_3.14.0         AnnotationDbi_1.56.1       
##  [3] clusterProfiler_4.2.0       sparseMatrixStats_1.6.0    
##  [5] Matrix_1.3-4                SummarizedExperiment_1.24.0
##  [7] Biobase_2.54.0              GenomicRanges_1.46.0       
##  [9] GenomeInfoDb_1.30.0         IRanges_2.28.0             
## [11] S4Vectors_0.32.0            BiocGenerics_0.40.0        
## [13] MatrixGenerics_1.6.0        matrixStats_0.61.0         
## [15] ggbeeswarm_0.6.0            plotly_4.10.0              
## [17] cowplot_1.1.1               forcats_0.5.1              
## [19] stringr_1.4.0               dplyr_1.0.8                
## [21] purrr_0.3.4                 readr_2.1.1                
## [23] tidyr_1.1.4                 tibble_3.1.7               
## [25] ggplot2_3.3.5               tidyverse_1.3.1            
## [27] magrittr_2.0.3             
## 
## loaded via a namespace (and not attached):
##   [1] shadowtext_0.1.2       readxl_1.3.1           backports_1.4.0       
##   [4] fastmatch_1.1-3        systemfonts_1.0.3      plyr_1.8.7            
##   [7] igraph_1.2.9           lazyeval_0.2.2         splines_4.1.1         
##  [10] crosstalk_1.2.0        BiocParallel_1.28.0    digest_0.6.29         
##  [13] yulab.utils_0.0.5      htmltools_0.5.2        GOSemSim_2.20.0       
##  [16] viridis_0.6.2          GO.db_3.14.0           fansi_0.5.0           
##  [19] memoise_2.0.1          tzdb_0.2.0             Biostrings_2.62.0     
##  [22] graphlayouts_0.8.1     modelr_0.1.8           enrichplot_1.14.1     
##  [25] colorspace_2.0-2       blob_1.2.2             rvest_1.0.2           
##  [28] ggrepel_0.9.1          textshaping_0.3.6      haven_2.4.3           
##  [31] xfun_0.30              crayon_1.4.2           RCurl_1.98-1.5        
##  [34] jsonlite_1.7.2         scatterpie_0.1.8       ape_5.6-2             
##  [37] glue_1.6.2             polyclip_1.10-0        gtable_0.3.0          
##  [40] zlibbioc_1.40.0        XVector_0.34.0         DelayedArray_0.20.0   
##  [43] scales_1.1.1           DOSE_3.20.0            DBI_1.1.1             
##  [46] Rcpp_1.0.7             viridisLite_0.4.0      gridGraphics_0.5-1    
##  [49] tidytree_0.4.0         bit_4.0.4              htmlwidgets_1.5.4     
##  [52] httr_1.4.2             fgsea_1.20.0           RColorBrewer_1.1-2    
##  [55] ellipsis_0.3.2         pkgconfig_2.0.3        farver_2.1.0          
##  [58] sass_0.4.0             dbplyr_2.1.1           utf8_1.2.2            
##  [61] labeling_0.4.2         ggplotify_0.1.0        tidyselect_1.1.1      
##  [64] rlang_1.0.2            reshape2_1.4.4         munsell_0.5.0         
##  [67] cellranger_1.1.0       tools_4.1.1            cachem_1.0.6          
##  [70] downloader_0.4         cli_3.3.0              generics_0.1.1        
##  [73] RSQLite_2.2.8          ggridges_0.5.3         broom_0.8.0           
##  [76] evaluate_0.15          fastmap_1.1.0          ragg_1.2.1            
##  [79] yaml_2.2.1             ggtree_3.2.0           knitr_1.39            
##  [82] bit64_4.0.5            fs_1.5.2               tidygraph_1.2.1       
##  [85] KEGGREST_1.34.0        ggraph_2.0.6           nlme_3.1-153          
##  [88] aplot_0.1.7            DO.db_2.9              xml2_1.3.3            
##  [91] compiler_4.1.1         rstudioapi_0.13        beeswarm_0.4.0        
##  [94] png_0.1-7              reprex_2.0.1           treeio_1.18.0         
##  [97] tweenr_2.0.0           bslib_0.3.1            stringi_1.7.6         
## [100] highr_0.9              lattice_0.20-45        vctrs_0.4.1           
## [103] pillar_1.7.0           lifecycle_1.0.1        jquerylib_0.1.4       
## [106] data.table_1.14.2      bitops_1.0-7           patchwork_1.1.1       
## [109] qvalue_2.26.0          R6_2.5.1               gridExtra_2.3         
## [112] writexl_1.4.0          vipor_0.4.5            MASS_7.3-54           
## [115] assertthat_0.2.1       withr_2.4.3            GenomeInfoDbData_1.2.7
## [118] parallel_4.1.1         hms_1.1.1              grid_4.1.1            
## [121] ggfun_0.0.7            rmarkdown_2.11         ggnewscale_0.4.7      
## [124] ggforce_0.3.3          lubridate_1.8.0

Conda Environment

## Conda Environment YAML
name: base
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - anaconda-client=1.8.0=pyhd8ed1ab_0
  - anaconda-project=0.10.2=pyhd8ed1ab_0
  - attrs=21.2.0=pyhd8ed1ab_0
  - awscli=1.25.79=py39h6e9494a_0
  - backports=1.0=py_2
  - backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
  - backports.zoneinfo=0.2.1=py39h701faf5_5
  - bagit=1.8.1=pyhd8ed1ab_0
  - bagit-profile=1.3.1=pyhd8ed1ab_0
  - bdbag=1.6.1=pyhd8ed1ab_0
  - beautifulsoup4=4.9.3=pyhb0f4dca_0
  - blinker=1.4=py_1
  - boa=0.11.0=pyha770c72_3
  - boolean.py=3.7=py_0
  - boto3=1.24.78=pyhd8ed1ab_0
  - botocore=1.27.78=pyhd8ed1ab_0
  - brotlipy=0.7.0=py39h63b48b0_1004
  - bzip2=1.0.8=h0d85af4_4
  - c-ares=1.18.1=h0d85af4_0
  - ca-certificates=2022.9.24=h033912b_0
  - cairo=1.16.0=he43a7df_1008
  - cctools=973.0.1=hd9211c8_2
  - cctools_osx-64=973.0.1=h3e07e27_2
  - certifi=2022.9.24=pyhd8ed1ab_0
  - cffi=1.15.1=py39hae9ecf2_0
  - chardet=5.0.0=py39h6e9494a_0
  - charset-normalizer=2.0.0=pyhd8ed1ab_0
  - click=8.1.3=py39h6e9494a_0
  - clyent=1.2.2=py_1
  - colorama=0.4.3=py_0
  - commonmark=0.9.1=py_0
  - conda=4.14.0=py39h6e9494a_0
  - conda-build=3.21.9=py39h6e9494a_1
  - conda-forge-pinning=2021.10.10.22.03.30=hd8ed1ab_0
  - conda-libmamba-solver=22.6.0=pyhd8ed1ab_0
  - conda-pack=0.6.0=pyhd3deb0d_0
  - conda-package-handling=1.9.0=py39ha30fb19_0
  - conda-smithy=3.17.2=pyhd8ed1ab_0
  - conda-standalone=4.10.3=h694c41f_0
  - conda-suggest=0.1.1=pyh9f0ad1d_0
  - conda-suggest-conda-forge=2021.8.24=h694c41f_0
  - conda-verify=3.1.1=py39h6e9494a_1004
  - constructor=3.3.1=py39h6e9494a_0
  - cryptography=37.0.4=py39h9c2a9ce_0
  - curl=7.83.1=h372c54d_0
  - dataclasses=0.8=pyhc8e2a94_3
  - dbus=1.13.6=ha13b53f_2
  - deprecated=1.2.12=pyh44b312d_0
  - docutils=0.16=py39h6e9494a_3
  - expat=2.4.1=he49afe7_0
  - ffq=0.2.1=pyhdfd78af_0
  - filelock=3.0.12=pyh9f0ad1d_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=hab24e00_0
  - fontconfig=2.13.1=h10f422b_1005
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - freetype=2.10.4=h4cff582_1
  - fribidi=1.0.10=hbcb3906_0
  - frozendict=2.3.4=py39h701faf5_0
  - future=0.18.2=py39h6e9494a_5
  - gawk=5.1.0=h8a989fb_0
  - gdk-pixbuf=2.42.6=h2e6141f_0
  - gettext=0.19.8.1=hd1a6beb_1008
  - giflib=5.2.1=hbcb3906_2
  - git=2.33.0=pl5321h9a53687_2
  - git-lfs=2.13.3=h694c41f_0
  - gitdb=4.0.7=pyhd8ed1ab_0
  - gitpython=3.1.18=pyhd8ed1ab_0
  - glib=2.70.2=hcf210ce_0
  - glib-tools=2.70.2=hcf210ce_0
  - glob2=0.7=py_0
  - globus-sdk=2.0.1=pyhd8ed1ab_0
  - gmp=6.2.1=h2e338ed_0
  - gnutls=3.6.13=h756fd2b_1
  - graphite2=1.3.13=h2e338ed_1001
  - harfbuzz=2.9.0=h159f659_0
  - htop=3.2.1=h398481e_0
  - htslib=1.15=hc057d7f_0
  - hub=2.14.2=hc7d050b_0
  - icu=68.1=h74dc148_0
  - idna=3.1=pyhd3deb0d_0
  - importlib-metadata=4.11.4=py39h6e9494a_0
  - importlib_metadata=4.11.4=hd8ed1ab_0
  - importlib_resources=5.4.0=pyhd8ed1ab_0
  - inotify_simple=1.3.5=pyha770c72_3
  - ipython_genutils=0.2.0=py_1
  - isodate=0.6.0=py_1
  - jbig=2.1=h0d85af4_2003
  - jinja2=3.0.1=pyhd8ed1ab_0
  - jmespath=0.10.0=pyh9f0ad1d_0
  - joblib=1.0.1=pyhd8ed1ab_0
  - jpeg=9d=hbcb3906_0
  - json5=0.9.5=pyh9f0ad1d_0
  - jsonschema=4.3.1=pyhd8ed1ab_0
  - jupyter_core=4.11.1=py39h6e9494a_0
  - krb5=1.19.3=hb49756b_0
  - ld64=609=hd2e7500_2
  - ld64_osx-64=609=h2487922_2
  - ldid=2.1.2=h6a69015_3
  - lerc=2.2.1=h046ec9c_0
  - libarchive=3.5.2=h2b60450_0
  - libcurl=7.83.1=h372c54d_0
  - libcxx=14.0.6=hccf4f1f_0
  - libdeflate=1.10=h0d85af4_0
  - libedit=3.1.20191231=h0678c8f_2
  - libev=4.33=haf1e3a3_1
  - libffi=3.4.2=h0d85af4_5
  - libglib=2.70.2=hf1fb8c0_0
  - libiconv=1.16=haf1e3a3_0
  - libidn2=2.3.2=h0d85af4_0
  - liblief=0.11.5=he49afe7_0
  - libllvm12=12.0.1=hd011deb_2
  - libmamba=0.25.0=h3ac2a45_2
  - libmambapy=0.25.0=py39h85aca11_2
  - libnghttp2=1.47.0=h942079c_0
  - libpng=1.6.37=h7cec526_2
  - librsvg=2.50.7=hd2a7919_0
  - libsolv=0.7.22=hd9580d2_0
  - libssh2=1.10.0=h52ee1ee_0
  - libtiff=4.3.0=h1167814_0
  - libunistring=0.9.10=h0d85af4_0
  - libwebp-base=1.2.1=h0d85af4_0
  - libxml2=2.9.12=h93ec3fd_0
  - libxslt=1.1.33=h5739fc3_2
  - libzlib=1.2.11=h9173be1_1013
  - license-expression=1.2=py_0
  - lxml=4.8.0=py39h63b48b0_2
  - lz4-c=1.9.3=he49afe7_1
  - lzo=2.10=haf1e3a3_1000
  - mamba=0.25.0=py39ha435c47_2
  - markupsafe=2.1.1=py39h63b48b0_1
  - msrest=0.6.21=pyh44b312d_0
  - nbformat=5.1.3=pyhd8ed1ab_0
  - ncurses=6.3=h96cf925_1
  - nettle=3.6=hedd7734_0
  - oauthlib=3.1.1=pyhd8ed1ab_0
  - openssl=1.1.1q=hfe4f2af_0
  - pango=1.48.9=ha05cd14_0
  - patch=2.7.6=hbcf498f_1002
  - pcre=8.45=he49afe7_0
  - pcre2=10.37=ha16e1b2_0
  - perl=5.32.1=0_h0d85af4_perl5
  - pigz=2.6=h5dbffcc_0
  - pip=21.2.4=pyhd8ed1ab_0
  - pixman=0.40.0=hbcb3906_0
  - pkginfo=1.7.1=pyhd8ed1ab_0
  - prompt-toolkit=3.0.20=pyha770c72_0
  - prompt_toolkit=3.0.20=hd8ed1ab_0
  - psutil=5.9.2=py39ha30fb19_0
  - py-lief=0.11.5=py39h9fcab8e_0
  - pyasn1=0.4.8=py_0
  - pybind11-abi=4=hd8ed1ab_3
  - pycosat=0.6.3=py39h63b48b0_1010
  - pycparser=2.20=pyh9f0ad1d_2
  - pycrypto=2.6.1=py39h89e85a6_1006
  - pygithub=1.53=py_0
  - pygments=2.10.0=pyhd8ed1ab_0
  - pyjwt=1.7.1=py_0
  - pyopenssl=20.0.1=pyhd8ed1ab_0
  - pyrsistent=0.18.1=py39h63b48b0_1
  - pysocks=1.7.1=pyha2e5f31_6
  - python=3.9.13=h57e37ff_0_cpython
  - python-dateutil=2.8.2=pyhd8ed1ab_0
  - python-libarchive-c=4.0=py39h6e9494a_1
  - python-tzdata=2021.5=pyhd8ed1ab_0
  - python_abi=3.9=2_cp39
  - pytz=2021.1=pyhd8ed1ab_0
  - pytz-deprecation-shim=0.1.0.post0=py39h6e9494a_2
  - pyyaml=5.4.1=py39h701faf5_3
  - readline=8.1.2=h3899abd_0
  - reproc=14.2.3=h0d85af4_0
  - reproc-cpp=14.2.3=he49afe7_0
  - requests=2.28.1=pyhd8ed1ab_1
  - requests-oauthlib=1.3.0=pyh9f0ad1d_0
  - rich=10.16.1=pyhd8ed1ab_0
  - ripgrep=13.0.0=h244e342_0
  - rsa=4.7.2=pyh44b312d_0
  - ruamel.yaml=0.17.21=py39h63b48b0_1
  - ruamel.yaml.clib=0.2.6=py39h63b48b0_1
  - ruamel_yaml=0.15.80=py39h701faf5_1007
  - s3transfer=0.6.0=pyhd8ed1ab_0
  - scrypt=0.8.18=py39h6a41abd_3
  - setuptools=65.3.0=pyhd8ed1ab_1
  - six=1.16.0=pyh6c4a22f_0
  - smartmontools=7.2=h940c156_0
  - smmap=3.0.5=pyh44b312d_0
  - soupsieve=2.3.1=pyhd8ed1ab_0
  - sqlite=3.38.5=hd9f0692_0
  - tapi=1100.0.11=h9ce4665_0
  - tk=8.6.12=h5dbffcc_0
  - toolz=0.11.1=py_0
  - tornado=6.2=py39h701faf5_0
  - tqdm=4.62.2=pyhd8ed1ab_0
  - traitlets=5.1.0=pyhd8ed1ab_0
  - typing_extensions=3.10.0.0=pyha770c72_0
  - tzdata=2021e=he74cb21_0
  - tzlocal=4.2=py39h6e9494a_1
  - urllib3=1.26.6=pyhd8ed1ab_0
  - vsts-python-api=0.1.22=py_0
  - watchgod=0.7=pyhd8ed1ab_0
  - wcwidth=0.2.5=pyh9f0ad1d_2
  - wget=1.20.3=h52ee1ee_1
  - wheel=0.37.0=pyhd8ed1ab_1
  - wrapt=1.14.1=py39h701faf5_0
  - xz=5.2.5=haf1e3a3_1
  - yaml=0.2.5=haf1e3a3_0
  - yaml-cpp=0.7.0=hb486fe8_1
  - zipp=3.5.0=pyhd8ed1ab_0
  - zlib=1.2.11=h9173be1_1013
  - zstd=1.5.0=h582d3a0_0
prefix: /Users/mfansler/miniconda3